package com.xiaoshuidi.cloud.framework.hangxin.core.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

@Data
public class InvoicingReqDTO {
    @NotEmpty(message = "授权码不能为空")
    private String authorizationCode;
    @NotEmpty(message = "纳税人识别号不能为空")
    private String taxpayerId;
    /**
     * 发票请求唯一流水号 长度在 20-50 位之间，唯一不可重复。为保证全平台流水号唯一，建议使用：公司首字母缩写或英文名+yyyyMMddHHmmss+若干位随机数。
     **/
    @Schema(description = "发票请求唯一流水号 长度在 20-50 位之间，唯一不可重复。为保证全平台流水号唯一，建议使用：公司首字母缩写或英文名+yyyyMMddHHmmss+若干位随机数。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "发票请求唯一流水号不能为空")
    private String FPQQLSH;
    /**
     * 订单号 订单号，如果传入为空，则系统自动生成订单号
     **/
    @Schema(description = "订单号，如果传入为空，则系统自动生成订单号")
    private String DDH;
    /**
     * 开票类型 0-蓝字发票；1-红字发票
     **/
    @Schema(description = "开票类型 0-蓝字发票；1-红字发票", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "开票类型不能为空")
    private String KPLX;
    /**
     * 税收分类编码编码表版本号 传值：33.0
     **/
    @Schema(description = "税收分类编码编码表版本号 传值：33.0", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "税收分类编码编码表版本号不能为空")
    private String BMB_BBH;
    /**
     * 销货清单 2-收购发票；空或其他值-非收购发票（暂不支持收购发票开具）
     **/
    @Schema(description = "销货清单 2-收购发票；空或其他值-非收购发票（暂不支持收购发票开具）")
    private String XHQD;
    /**
     * 销售方纳税人识别号 15、17、18、20 位的数字+大写字母
     **/
    @Schema(description = "销售方纳税人识别号 15、17、18、20 位的数字+大写字母", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "销售方纳税人识别号不能为空")
    private String XSF_NSRSBH;
    /**
     * 销售方名称 VARCHAR 100 是8. XSF_DZDH 销售方地址、电话
     **/
    @Schema(description = "销售方名称 VARCHAR 100 是8. XSF_DZDH 销售方地址、电话", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "销售方名称不能为空")
    private String XSF_MC;
    /**
     * 销售方地址、电话
     */
    @Schema(description = "销售方地址、电话", requiredMode = Schema.RequiredMode.REQUIRED)
    private String XSF_DZDH;
    /**
     * 销售方银行账号
     **/
    @Schema(description = "销售方银行账号")
    private String XSF_YHZH;
    /**
     * 购买方纳税人识别号 15、17、18、20 位的数字+大写字母
     **/
    @Schema(description = "购买方纳税人识别号 15、17、18、20 位的数字+大写字母")
    private String GMF_NSRSBH;
    /**
     * 购买方名称
     **/
    @Schema(description = "购买方名称", requiredMode = Schema.RequiredMode.REQUIRED)
    private String GMF_MC;
    /**
     * 购买方地址、电话
     **/
    @Schema(description = "购买方地址、电话")
    private String GMF_DZDH;
    /**
     * 购买方手机
     **/
    @Schema(description = "购买方手机")
    private String GMF_SJ;
    /**
     * 购买方邮箱
     **/
    @Schema(description = "购买方邮箱")
    private String GMF_EMAIL;
    /**
     * 购买方银行账号
     **/
    @Schema(description = "购买方银行账号")
    private String GMF_YHZH;
    /**
     * 开票人
     **/
    @Schema(description = "开票人", requiredMode = Schema.RequiredMode.REQUIRED)
    private String KPR;
    /**
     * 收款人
     **/
    @Schema(description = "收款人")
    private String SKR;
    /**
     * 复核人
     **/
    @Schema(description = "复核人")
    private String FHR;
    /**
     * 原发票代码
     **/
    @Schema(description = "原发票代码")
    private String YFP_DM;
    /**
     * 原发票号码 红字发票时必须
     **/
    @Schema(description = "原发票号码 红字发票时必须")
    private String YFP_HM;
    /**
     * 原发票种类代码 81：电子发票（增值税专用发票）；82：电子发票（普通发票）
     **/
    @Schema(description = "原发票种类代码 81：电子发票（增值税专用发票）；82：电子发票（普通发票）")
    private String YFPZL_DM;
    /**
     * 原开票日期 2021 年 12 月总局需求要求传入对应蓝字发票的开具日期。格式：YYYYMMDD
     **/
    @Schema(description = "原开票日期 2021 年 12 月总局需求要求传入对应蓝字发票的开具日期。格式：YYYYMMDD")
    private String YKPRQ;
    /**
     * 冲红原因 对应蓝字发票冲红原因（开具红票理由）：1-销货退回；2-开票有误；3-服务中止；4-销售折让；
     **/
    @Schema(description = "冲红原因 对应蓝字发票冲红原因（开具红票理由）：1-销货退回；2-开票有误；3-服务中止；4-销售折让；")
    private String CHYY;
    /**
     * 价税合计 单位：元（2 位小数），商品行价税合计之和
     **/
    @Schema(description = "价税合计 单位：元（2 位小数），商品行价税合计之和", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "价税合计不能为空")
    private String JSHJ;
    /**
     * 合计不含税金额 不含税，单位：元（2 位小数）
     **/
    @Schema(description = "合计不含税金额 不含税，单位：元（2 位小数）", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "合计不含税金额不能为空")
    private String HJJE;
    /**
     * 合计税额 单位：元（2 位小数）
     **/
    @Schema(description = "合计税额 单位：元（2 位小数）", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotEmpty(message = "合计税额不能为空")
    private String HJSE;
    /**
     * 3%税率开具理由 小规模纳税人（含转登记纳税人）选择开具 3%、1%税率的发票时需选择放弃免税的原因并记录：0:空1-政策出台前发生纳税义务；2-前期已开具相应征收率发票，发生销售折让、中止或者退回等情形需要开具红字发票，或者开票有误需要重新开具；3-因为实际经营业务需要，放弃享受免征增值税政策。
     **/
    @Schema(description = "3%税率开具理由 小规模纳税人（含转登记纳税人）选择开具 3%、1%税率的发票时需选择放弃免税的原因并记录：0:空1-政策出台前发生纳税义务；2-前期已开具相应征收率发票，发生销售折让、中止或者退回等情形需要开具红字发票，或者开票有误需要重新开具；3-因为实际经营业务需要，放弃享受免征增值税政策。")
    private String SSLKJLY;
    /**
     * 备注 红字发票备注必须以“被红冲蓝字数电票号码:YYYYYYYY 红字发票信息确认单编号:ZZZZZZZZZZZZZZZZ”字样”开头差额征税发票开具时，备注要求:蓝票必须在备注中注明“差额征税：X。”字样，其中“X”为差额值，并且保留两位小数，例如 X = 10.00。红票必须在备注中注明“差额征税”字样，如未注明，系统自动追加。蓝票差额备注如：差额征税：10.00。12 月开票红票差额备注如：差额征税。对应正数发票代码:XXXXXXXXXXXX 号 码:YYYYYYYY其中差额征税：10.00。的“：”和“。”均为全角格式。
     **/
    @Schema(description = "备注 红字发票备注必须以“被红冲蓝字数电票号码:YYYYYYYY 红字发票信息确认单编号:ZZZZZZZZZZZZZZZZ”字样”开头差额征税发票开具时，备注要求:蓝票必须在备注中注明“差额征税：X。”字样，其中“X”为差额值，并且保留两位小数，例如 X = 10.00。红票必须在备注中注明“差额征税”字样，如未注明，系统自动追加。蓝票差额备注如：差额征税：10.00。12 月开票红票差额备注如：差额征税。对应正数发票代码:XXXXXXXXXXXX 号 码:YYYYYYYY其中差额征税：10.00。的“：”和“。”均为全角格式。")
    private String BZ;
    /**
     * 发票种类 1. 当 FPZL 字段为 81 时：开具电子发票（增值税专用发票）。2. 当 FPZL 字段不为 81时：开具电子发票（普通发票）
     **/
    @Schema(description = "发票种类 1. 当 FPZL 字段为 81 时：开具电子发票（增值税专用发票）。2. 当 FPZL 字段不为 81时：开具电子发票（普通发票）")
    private String FPZL;

    @Schema(description = "发票明细行信息", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "发票明细行信息不能为空")
    @Valid
    List<InvoicingItemDTO> items;
}
